package productos;

import java.util.HashMap;
import java.util.Map;


//IMPORTANTE no olvidarse de importar joda
import org.joda.time.DateTime;

import categoriasYunidadesDeMedida.UnidadDeMedida;
import envio.Envio;

public class Presentacion {

	// Uso integer porque algunas listas no aceptan tipos primitivos
	protected String codigoDeBarras;
	protected Double precioUnitarioCompra;
	protected Double precioUnitarioVenta;
	protected Map<DateTime, Double> historialPrecios;
	private UnidadDeMedida unidadDeMedida;
	private Ubicacion ubicacion;
	public Producto fabricanteYtipo;
	public Stock stock;


	public Presentacion(String codBar, Producto producto, Stock stock) {
		historialPrecios = new HashMap<DateTime, Double>();
		codigoDeBarras = codBar;
		fabricanteYtipo = producto;
		this.stock = stock;
	}

	public Ubicacion getUbicacion() {
		return ubicacion;
	}

	public void setUbicacion(Ubicacion ubicacion) {
		this.ubicacion = ubicacion;
	}

	public Double getPrecioUnitarioCompra() {
		return precioUnitarioCompra;
	}

	public Map<DateTime, Double> getHistorialPrecios() {
		return historialPrecios;
	}
	


	// Lo tuve que crear para poder hacer la venta
	public Double precioParaConsumidor() {
		// TODO Auto-generated method stub
		return this.precioUnitarioVenta;
	}

	public String id() {

		return this.codigoDeBarras;
	}

	public boolean porDebajoStockCritico() {

		return stock.porDebajoStockCritico();
	}

	public boolean porDebajoStockMinimo() {
		// TODO Auto-generated method stub
		return stock.porDebajoStockMinimo();
	}

	public boolean stockDisponible(Integer i) {

		return (stock.getCantidadStock() >= i);
	}

	public UnidadDeMedida unidadDeMedida() {
		return unidadDeMedida;
	}
	
	public void setUnidadDeMedida(UnidadDeMedida unaUnidadDeMedida){
		this.unidadDeMedida = unaUnidadDeMedida;
	}

	/**
	 * Verifica Si la presentacion posee la cantidad pasada por parametro, de lo
	 * contrario tira una exepcion de tipo, stock no disponible
	 * 
	 * @param Integer
	 *            : Cant que se quiere verder.
	 */
	public void verificarDisponibilidad(Integer cant)
			throws StockNoDisponibleExeption {
		// TODO Auto-generated method stub
		if(!(this.stockDisponible(cant))){
			throw new StockNoDisponibleExeption();
		}
	}

	public void setPrecioUnitarioVenta(double precioUnitarioDeVenta) {
		this.precioUnitarioVenta = precioUnitarioDeVenta;
		
	}

	public void agregarEnvioComoObservadorAStock(Envio envio) {
		this.stock.agregarEnvioObservador(envio);
		
	}
	
	
}
